/****************************************************************
 **                                                             *
 ** Nombre: VisualizadorEdicionProgramas.java                   *
 ** Versión: 1.0.0                                              *
 ** Autor: Amado de Jesús Canté Cauich                          *
 ** Creado: 7-feb-2013                                          *
 ** Modificado:                                                 *
 ** Diagrama: GAPI v4.7.1                                       *
 ** Caso de uso: MGPE2, MGPE3                                   *
 ****************************************************************/
package Servicios;

import DAO.DAOCarrera;
import DAO.DAOProgramaEducativo;
import Dominio.AsignaturaOptativa;
import Dominio.Carrera;
import Dominio.ProgramaEducativo;
import Dominio.ReticulaAcademica;
import Dominio.Semestre;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Proporciona los servicios de edición de programas educativos.
 * @author amado.cante
 */
public class VisualizadorEdicionProgramas extends HttpServlet {

    /**
     * Procesa la petición recibida por
     * <code>GET</code> y
     * <code>POST</code>, determina el servicio solicitado y transfiere el control
     * al método correpsondiente.
     *
     * @param request Petición del servlet
     * @param response Repsuesta del servlet.
     * @throws ServletException Si ocurre algún problema con el servlet.
     * @throws IOException Si ocurre algún problema de lectura/escritura.
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String param = request.getParameter("action");
        switch(param){
            case "editarPE":
                this.muestraEditables(request, response);
                break;
            case "muestraEdicionPE":
                this.muestraEdicionPE(request,response);
                break;
            case "muestraCambioReticula":
                this.muestraCambioReticula(request,response);
                break;
            case "muestraEliminarPE" :
                muestraProgramasEducativosEliminables(request, response);
                break;
            default:
                PrintWriter out = response.getWriter();
                out.println("Servicio no reconocido.");
                break;
        }
    }
    
    /**
     * Obtiene la lista de programas educativos editables - aquellos que no tienen
     * ningún alumno asociado, y que ninguna de las asignaturas que conforman su
     * retíicula académica se encuentra en la oferta académicavigente.
     * @param request Petición del servlet
     * @param response Respuesta del servlet.
     * @throws ServletException Si ocurre algún problema con el servlet.
     * @throws IOException Si ocurre algún problema de lectura/escritura.
     */
    protected void muestraEditables(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {   
            DAOProgramaEducativo daoprograma = new DAOProgramaEducativo();
            ArrayList<ProgramaEducativo> programas = daoprograma.listarProgramasEditables();
            if(programas !=null && programas.size()>=0){
                String respuesta = "<div class=\"contenedorFormularioRegistroAlumno\">"
                                  + "<h3>Programas educativos editables</h3>"
                                  + "<table><tr><td>Programa Educativo</td><td>Acci&oacute;n</td></tr>";
                if(programas!=null && programas.size()>0){
                    for(int i=0;i<programas.size();i++){
                        respuesta+="<tr><td>"+programas.get(i).getNombre()+"</td><td><input type='button' value='Editar' onClick='editaPrograma("+programas.get(i).getCvePrograma() +")' /></td></tr>";
                    }
                    respuesta+="</table>"
                             + "</div>";
                out.println(respuesta);
                }else{
                 respuesta = "Lo sentimos. No es posible editar ninguno de los programas educativos registrados<br>"
                        + "debido a que todos tienen al menos un alumno asociado.";
                out.println(respuesta);
                }
            }else{
                 String respuesta = "A&uacute;n no hay Programas Educativos registrados.";
                out.println(respuesta);
            }
        
        }finally {            
             out.close();
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    /**
     * Genera el formulario de edición de datos de identificación del programa educativo
     * seleccionado.
     * @param request Petición del servlet.
     * @param response Repuesta del servlet.
     * @throws ServletException Si ocurre algún problema con el servlet.
     * @throws IOException  Si ocurre algún problema de lectura/escritura.
     */
    protected void muestraEdicionPE(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        String clavePE = request.getParameter("clavePE");
        try{
            DAOProgramaEducativo daoprograma = new DAOProgramaEducativo();
            ProgramaEducativo p = daoprograma.buscarPrograma(Integer.parseInt(clavePE));
            String respuesta="<table><tr><td>Clave:</td><td><input type='text' name='clavePE' id='clavePE' value='"+p.getCvePrograma()+"' readonly /></td></tr>"
                    + "<tr><td>Nombre:</td><td>"
                    + "<input type='hidden' name='prevNom' id='prevNom' value='"+p.getNombre()
                    +"' /><input type='hidden' name='prevCarrera' id='prevCarrera' value='"+p.getCarrera().getClaveCarrera()+"' />"
                    + "<input type='text' name='nombrePE' id='nombrePE' onChange='activaBtn()' onKeyUp='this.value=this.value.toUpperCase()' value='"
                    +p.getNombre()+"' /></td></tr>"
                    + "<tr><td>Carrera:</td><td>"+llenaComboCarrera(p.getCarrera())
                    +"</td></tr></table><br />"
                    + "<input type='button' value='Editar Ret&iacute;cula' onClick='verificaEdicionReticula()' />"
                    + "<input id='btnGuardaCPE' type='button' value='Guardar' onClick='guardaCambiosPE()' disabled />"
                    + "<input type='button' value='Cancelar' onClick='javascript:document.location.href=document.location.href' /><br />"
                    + "Ret&iacute;cula Acad&eacute;mica<br />"
                    + obtenerReticulaImprimible(p.getReticula())+"<br />"
                    + "Asignaturas Optativas<br />"+listarOptativas(p.getReticula().getAsignaturasOptativas());
            out.println(respuesta);
        }finally{
            out.close();
        }
    }

    /**
     * Obtiene la lista de carreras registradas en el sistema y genera el código
     * html para mostrar la información en forma de una lista desplegable.
     * @param carrera Nombre de la carrera actual del programa educativo.
     * @return Cadena de código html para mostrar el combo de carreras.
     */
    private String llenaComboCarrera(Carrera carrera) {
        DAOCarrera daocarrera = new DAOCarrera();
        ArrayList<Carrera> carreras = daocarrera.buscarTodasLasCarreras();
        String combo = "<select name='carreraPE' id='carreraPE' onChange='activaBtn()' >";
        if(carreras != null && carreras.size()>0){
            for(int i=0;i<carreras.size();i++){
                int claveCarreraBuscada = carreras.get(i).getClaveCarrera(); 
                combo+="<option value='"+claveCarreraBuscada+"'";
                if(claveCarreraBuscada==carrera.getClaveCarrera()){
                    combo+=" selected='selected' ";
                }
                combo+=" >"+carreras.get(i).getNombre()+"</option>";
            }
        }
        combo+="</select>";
        return combo;
    }

    /**
     * Genera la representación de la retícula académica en formato de tabla html.
     * @param reticula Instancia de RetículaAcadémica que desea representar.
     * @return Cadena de código html que representa la Retícula Académica en forma de tabla.
     */
    private String obtenerReticulaImprimible(ReticulaAcademica reticula) {
        int numSemestres=reticula.getNumeroDeSemestres();
        ArrayList<Semestre> semestres = reticula.getListaDeSemestres();
        
        int filasTabla=0;
        for(int i=0;i<numSemestres;i++){
            if(filasTabla<reticula.getListaDeSemestres().get(i).getListaDeAsignaturas().size()){
                filasTabla = reticula.getListaDeSemestres().get(i).getListaDeAsignaturas().size();
            }
        }
        String tabla = "<table><tr>";
        for(int j=0;j<numSemestres;j++){
            tabla+="<td>"+semestres.get(j).getNombre()+"</td>";
        }
        tabla+="</tr>";
        for(int fila=0;fila<filasTabla;fila++){
            tabla+="<tr>";
            for(int s=0;s<numSemestres;s++){

                if(fila < semestres.get(s).getListaDeAsignaturas().size() && semestres.get(s).getListaDeAsignaturas().get(fila)!=null){
                    tabla+="<td>"+semestres.get(s).getListaDeAsignaturas().get(fila).getNombre()+"</td>";
                }else{
                    tabla+="<td>&nbsp;</td>";
                }
            }
            tabla+="</tr>";
        }
        tabla+="</table>";
        return tabla;
    }

    /**
     * Genera una representación en forma de tabla para las asignaturas optativas
     * recibidas como parámetro.
     * @param asignaturasOptativas Asignaturas optativas a representar.
     * @return Código html para mostrar una tabla representando las asignaturas optativas.
     */
    private String listarOptativas(ArrayList<AsignaturaOptativa> asignaturasOptativas) {
        String lista="<table>";
        for(int i=0;i<asignaturasOptativas.size();i++){
            lista+="<tr><td>"+asignaturasOptativas.get(i).getNombre()+"</td></tr>";
        }
        lista+="</table>";
        return lista;
    }

    /**
     * Genera el código html necesario para mostrar el formulario de cambio de retícula académica
     * del programa educativo.
     * @param request Petición del servlet.
     * @param response Respuesta dle servlet.
     * @throws ServletException Si ocurre algún problema con el servlet.
     * @throws IOException  Si ocurre algún problema de lectura/escritura.
     */
    protected void muestraCambioReticula(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        int claveCarrera=Integer.parseInt(request.getParameter("claveCarrera"));
        String nombrePE=request.getParameter("nombrePE");  
        int clavePE = Integer.parseInt(request.getParameter("clavePE"));
        try{
            DAOCarrera daocarrera = new DAOCarrera();
            String nombreCarrera = daocarrera.buscarCarrera(claveCarrera).getNombre();
            String respuesta="<form name='frmCambiaRetPE' id='frmCambiaRetPE' action='GestorProgramaEducativo?action=cambiaRetAcad' enctype='multipart/form-data' method='post'><table>\n\t<tr>\n\t\t<td>Nombre del Programa:</td>\n\t\t"
                   + "<td><input type='hidden' id='clavePE' name='clavePE' value='"+clavePE+"' /><input type=\"text\" name=\"nombrePE\" id=\"nombrePE\" readonly value='"+nombrePE+"' /></td>\n\t</tr>\n"
                   + "<tr><td>Carrera:</td><td><input type='text' name=\"carrera\" id=\"carrera\" value='"+nombreCarrera+"' readonly /></td></tr>"
                   + "<tr><td>Ret&iacute;cula: </td><td><input type=\"file\" name=\"archivoReticulaCamb\" id=\"archivoReticulaCamb\"></td></tr>"
                   + "<tr><td colspan=\"2\" align=\"center\"><input type=\"button\" value=\"Registrar Programa\" id=\"actualizaRetAcad\" onClick='enviaFormEdicionRetAcad()' >"
                   + "<input type=\"button\" value=\"Cancelar\" onClick='cancelaRegistroPE()' /></td></tr>"
                   + "</table></form>";
            out.println(respuesta);
        }finally{
            out.close();
        }
    }
    
    /**
     * Genera el código html necesario para mosotrar los programas educativos eliminables,
     * que son los que no tienen nigún alumno asociado y que ninguna de sus
     * asignaturas cuenta con oferta vigente.
     * @param request petición del servlet.
     * @param response Respuesta del servlet.
     * @throws ServletException Si ocurre algún problema con el servlet.
     * @throws IOException  Si ocurre algún problema de lectura/escritura.
     */
    private void muestraProgramasEducativosEliminables(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {   
            DAOProgramaEducativo daoprograma = new DAOProgramaEducativo();
            ArrayList<ProgramaEducativo> programas = daoprograma.listarProgramasEditables();
            if(programas !=null && programas.size()>=0){
                String respuesta = "<div class=\"contenedorFormularioRegistroAlumno\">"
                                  + "<h3>Programas educativos eliminables</h3>"
                        + "<table><tr><td>Programa Educativo</td><td>Acci&oacute;n</td></tr>";
                if(programas!=null && programas.size()>0){
                    for(int i=0;i<programas.size();i++){
                        respuesta+="<tr><td>"+programas.get(i).getNombre()+"</td><td><input type='button' value='Eliminar' onClick='eliminarPrograma("+programas.get(i).getCvePrograma() +")' /></td></tr>";
                    }
                    respuesta+="</table>";
                    respuesta += "</div>";
                out.println(respuesta);
                }else{
                 respuesta = "Lo sentimos. No es posible eliminar ninguno de los programas educativos registrados<br>"
                        + "debido a que todos tienen al menos un alumno asociado.";
                out.println(respuesta);
                }
            }else{
                String respuesta="A&uacute;n no hay Programas Educativos registrados.";
                out.println(respuesta);
            }
        
        }finally {            
             out.close();
        }
    }

}
